/*
 * Copyright (c) 2021, Beijing Yonyou Audit Software. All rights reserved.
 *
 */
package proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author Clannad
 * @Date 2021-11-22
 */
public class ProxyHandler implements InvocationHandler {
    /**
     * 目标对象
     */
    private Object target;

    /**
     * 关联的这个实现类的方法被调用时执行
     *
     * @param proxy  代理对象
     * @param method 原对象被调用方法
     * @param args   方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object object = null;
        try {
            object = method.invoke(target, args);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return object;
    }

    /**
     * 绑定关系，关联到哪个接口（与具体实现类绑定）
     *
     * @param target 目标对相爱难关
     * @return 返回被代理对象的一个代理
     */
    public Object newProxyInstance(Object target) {
        this.target = target;
        /*
         * 指定类加载器，一组接口以及调用处理器生成动态代理类实例
         * 第一个参数指定产生代理对象的类加载器，需要将其指定为和目标对象同一个类加载器
         * 第二个参数要实现和目标对象一样的接口，所以只需要拿到目标对象的实现接口
         * 第三个参数表明这个被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法
         *,根据传入的目标返回一个代理对象
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}
